/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package moteur.carte;

import java.util.Vector;
import moteur.Terrain;
import moteur.Transport;
import moteur.paquet.PaquetVideException;
import moteur.partie.Joeur;

/**
 *
 * @author nlupins
 */
public class MouvementLegal {

    private Ville dest;
    private Transport t;
    private byte cost;

    /**
     *
     * @param dest
     * @param cost
     * @param t
     */
    public MouvementLegal(Ville dest, byte cost, Transport t) {
        this.dest = dest;
        this.cost = cost;
        this.t = t;
    }

    /**
     *
     * @param j
     * @return Les déplacement légaux du joeur.
     * @throws PaquetVideException
     */
    public static Vector<MouvementLegal> getMoves(Joeur j) throws PaquetVideException {

        Ville depart = j.getLocalisation();
        Vector<Road> routes = depart.getRoads();
        Vector<MouvementLegal> v = new Vector<MouvementLegal>();

        for (Road r : routes) {
            if (r instanceof Lac) {
                Lac l = (Lac) r;

                if (j.getCartes().getNb(Transport.KAYAK) > 1) {

                    for (Ville d : l.getVilles()) {
                        if (!d.equals(depart)) {
                            v.add(new MouvementLegal(d, (byte) 2, Transport.KAYAK));
                        }
                    }
                }
            } else {
                Arc a = (Arc) r;
                if (a.getPionTransport() != null) {
                    if (j.getCartes().getNb(a.getPionTransport()) >= a.getVal(depart)) {

                        v.add(new MouvementLegal(a.getArrive(depart), (byte) a.getVal(depart), a.getPionTransport()));
                    }
                }
                if (a.getTerrain() != Terrain.AQUEU) {
                    byte tmp = 3;
                    if (((Chemin) a).getObstrue()) {
                        tmp++;
                    }
                    if (j.getCartes().total() >= tmp) {

                        v.add(new MouvementLegal(a.getArrive(depart), tmp, null));

                    }
                }
            }
        }
            return v;
        }


    /**
     *
     * @return
     */
    public byte getCost() {
        return cost;
    }

    /**
     *
     * @return
     */
    public Ville getDest() {
        return dest;
    }

    /**
     *
     * @return
     */
    public Transport getT() {
        return t;
    }

}
